﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// NotReviewedButNeeded
#pragma once

#include "GcmpModelInterface.h"
#include "IExternalObject.h"

#include "ElementCreationOptions.h"
#include "IVisibilityTypeFlags.h"

namespace gcmp
{
    class GraphicsNodeReference;
    class Coordinate3d;
    class Vector3d;


    /// \brief 标注
    ///
    /// 标注，通过此类可以创建标注
    class GCMP_MODEL_INTERFACE_EXPORT IDimension : public IExternalObject
    {
        DEFINE_CAST_DERIVED(gcmp::IDimension, gcmp::IExternalObject)

    public:
        /// \brief 析构函数
        virtual ~IDimension();

#pragma region static methods
        /// \brief 创建标注
        ///
        /// \param pDocument 标注所属的文档
        /// \param viewId 标注所属的视图Id
        /// \param coordinate 工作平面所在的坐标系
        /// \param firstNodeReference 第一个锚点引用的节点
        /// \param secondNodeReference 第二个锚点引用的节点
        /// \param dimPosition 标注的位置
        /// \param eco 标注的元素创建选项
        /// \return 返回创建的用于标注的GRep指针
        static IDimension* CreateDimension(gcmp::IDocument* pDocument, ElementId viewId, const Coordinate3d& coordinate, const IGraphicsNodeReference& firstNodeReference,
            const IGraphicsNodeReference& secondNodeReference, const Vector3d& dimPosition, ElementCreationOptions eco = ElementCreationOptions::Normal);
#pragma endregion static methods

    public:
        /// \brief 获取标注所属的视图Id
        /// \return 返回标注所属的视图Id
        virtual ElementId GetViewId() const = 0;
        /// \brief 设置标注所属的视图Id
        /// \param viewId 标注所属的视图Id
        /// \return true-设置成功，false-设置失败
        virtual bool SetViewId(ElementId viewId) = 0;

        /// \brief 获取工作平面所在的坐标系
        /// \return 返回工作平面所在的坐标系
        virtual Coordinate3d GetCoordinate() const = 0;
        /// \brief 设置工作平面所在的坐标系
        /// \param coord 工作平面所在的坐标系
        /// \return true-设置成功，false-设置失败
        virtual bool SetCoordinate(const Coordinate3d& coord) = 0;

        /// \brief 获取标注字体大小
        /// \return 返回标注字体大小
        virtual double GetFontSize() const = 0;

        /// \brief 设置标注字体大小
        /// \param fontSize 标注字体大小
        /// \return true-设置成功，false-设置失败
        virtual bool SetFontSize(double fontSize) = 0;

        /// \brief 获取标注显示名称
        /// \return 返回标注显示名称
        virtual std::wstring GetDimensionName() const = 0;

        /// \brief 设置标注显示名称：设置了dimensionName之后，标注线上会显示这个字符串；如果未设置，则会显示实际长度
        /// \param dimensionName 标注显示名称
        /// \return true-设置成功，false-设置失败
        virtual bool SetDimensionName(const std::wstring& dimensionName) = 0;

        /// \brief 获取标注在属性面板上是显示名称还是显示默认值
        /// \return bool 如果返回true，就显示名称，否则显示默认值
        virtual bool IsShowName() const = 0;

        /// \brief 设置标注在属性面板上是显示名称还是显示默认值
        /// \param bool 如果传入参数值为true，就显示名称；如果传入参数值为false，就显示默认值
        /// \return void
        virtual bool SetShowName(bool isShowName) = 0;

        /// \brief 获取标注所有的引用节点
        /// \return 返回标注标注所有的引用节点
        virtual const std::vector<gcmp::GraphicsNodeReference>& GetReferenceObjects() const = 0;
        /// \brief 设置标注所有引用的节点
        /// \param objects 标注所有引用的节点
        /// \return true-设置成功，false-设置失败
        virtual bool SetReferenceObjects(const std::vector<GraphicsNodeReference>& objects) = 0;

        /// \brief 获取标注的位置
        /// \return 返回标注的位置
        virtual Vector3d GetDimensionPosition()const = 0;
        /// \brief 设置标注的位置
        /// \param pos 标注的位置
        /// \return true-设置成功，false-设置失败
        virtual bool SetDimensionPosition(const Vector3d& pos) = 0;

        /// \brief 获取可见性标记的非const指针,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记的非const指针
        virtual IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取可见性标记的const指针
        ///
        /// \return 返回可见性标记的const指针
        virtual const IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 获取可见性标记
        /// 
        /// \return 标记值
        GCMP_OBSOLETE_API(2020/09/01, IDimension::GetVisibilityTypeFlagsInHostDocument() const) virtual UInt32 GetVisibilityFlag() const = 0;

        /// \brief 设置可见性标记
        /// 
        /// \param flag 标记值
        GCMP_DEPRECATED_API(2020/09/01) virtual bool SetVisibilityFlag(UInt32 flag) = 0;

    };

}


